package br.com.gr.jcash.bo;

import br.com.gr.jcash.dao.CategoriaDAO;
import br.com.gr.jcash.dmp.Categoria;
import br.com.gr.jcash.dmp.TipoCategoria;
import br.com.gr.jcash.dmp.Usuario;
import br.com.gr.jcash.exception.JCashException;
import br.com.gr.jcash.iface.ICategoriaBO;
import br.com.gr.jcash.iface.IContaBO;
import br.com.gr.jcash.iface.IUsuarioBO;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Local;
import javax.ejb.Stateless;

@Stateless(mappedName = "ejb/CategoriaBO")
@Local(ICategoriaBO.class)
public class CategoriaBO implements ICategoriaBO {

    @EJB
    private CategoriaDAO dao;
    @EJB
    private IContaBO contaBO;
    @EJB
    private IUsuarioBO usuarioBO;
    @Resource
    private EJBContext context;

    public CategoriaBO() {
    }

    @Override
    public void criar(Categoria entidade) throws JCashException {
        entidade.setUsuario(getUsuario());
        dao.incluir(entidade);
    }

    @Override
    public Categoria editar(Categoria entidade) throws JCashException {
        return dao.atualizar(entidade);
    }

    @Override
    public void remover(Categoria entidade) throws JCashException {
        if (contaBO.existeContaPorCategoria(entidade)) {
            throw new JCashException("Não é possível excluir, existe conta para essa categoria");
        } else {
            dao.remover(entidade);
        }
            
    }

    @Override
    public Categoria buscarPorId(Long id) throws JCashException {
        return dao.buscarPorId(id);
    }

    @Override
    public List<Categoria> buscarTodos() throws JCashException {
        return dao.buscarTodos(getUsuario());
    }

    @Override
    public Long count() throws JCashException {
        return dao.count(getUsuario());
    }

    @Override
    public List<Categoria> buscarPorFaixa(int[] range) throws JCashException {
        return dao.buscarPorFaixa(getUsuario(), range);
    }

    private Usuario getUsuario() throws JCashException {
        return usuarioBO.buscarPorLogin(context.getCallerPrincipal().getName());
    }
    
    @Override
    public List<Categoria> buscarPorTipo(TipoCategoria... tipo) throws JCashException {
        return dao.buscarTodos("Categoria.buscarPorCatTipo", getUsuario(), Arrays.asList(tipo));
    }
}
